package metier.server;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.sql.Date;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collection;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map.Entry;

import donnees.Commande;
import donnees.FabriqueCommande;
import donnees.FabriqueLigneCommande;
import donnees.FabriqueProduit;
import donnees.Produit;

import metier.interfaces.IRemotePanier;

public class MetierPanier extends UnicastRemoteObject implements IRemotePanier {

	protected MetierPanier() throws RemoteException {
		super();
		// TODO Auto-generated constructor stub
	}

	@Override
	public Collection<Produit> getLesProduitsPanier(
			Collection<Integer> idProduits) throws RemoteException {
		Collection<Produit> produits = new ArrayList<Produit>();

		for (Integer i : idProduits) {
			try {
				produits.add(FabriqueProduit.getInstance().rechercher(i));
			} catch (SQLException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

		return produits;
	}

	@Override
	public boolean commander(HashMap<Integer, Integer> panier, Integer idClient)
			throws RemoteException {

		boolean res = true;

		/* Date du jour */
		Date now = new Date(System.currentTimeMillis());

		
		/* Création de la commande */
		Commande cmd = null;
		try {
			cmd = FabriqueCommande.getInstance().creer(0.0, now, null,
					idClient, 0);
		} catch (SQLException e1) {
			res = false;
			e1.printStackTrace();
		}

		if (cmd != null) {

			/* Création des lignes de commande */
			Produit prod = null;
			int delais;
			double prixtotal = 0.0;
			GregorianCalendar datelivraisonmax = new java.util.GregorianCalendar();
			GregorianCalendar livraison;
			datelivraisonmax.setTime(now);
			for (Entry<Integer, Integer> ligne : panier.entrySet()) {
				try {

					delais = 0;

					FabriqueLigneCommande.getInstance().creer(
							cmd.getIdCommande(), ligne.getKey(),
							ligne.getValue());

					// Récupérer produit
					prod = FabriqueProduit.getInstance().rechercher(
							ligne.getKey());

					/* Calculer livraison au plus tard */

					if (prod != null) {
						
						if (prod.getStock() >= ligne.getValue()) {
							delais = prod.getDelaiDispo();
						} else {
							delais = prod.getDelaiNonDispo();
						}

						livraison = new java.util.GregorianCalendar();
						livraison.setTime(now);
						// ajout delais date courante
						livraison.add(Calendar.DATE, delais);

						if (livraison.compareTo(datelivraisonmax) > 0) {
							datelivraisonmax = livraison;
						}

						// Ajouter prix produit x quantite au prix total
						prixtotal += (prod.getPrix() * ligne.getValue());
					}
					else {
						res=false;
					}

				} catch (SQLException e) {
					res = false;
					e.printStackTrace();
				}
			}

			/* Mettre à jour infos commande */
			Date dateLivraisonCmd = new Date(datelivraisonmax.getTimeInMillis());
			try {				
				
				FabriqueCommande.getInstance().update(cmd.getIdCommande(),
						prixtotal, dateLivraisonCmd, 1);
			} catch (SQLException e) {
				res = false;
				e.printStackTrace();
			}
		}
		return res;

	}

}
